package it.polimi.traveldream.ejb.bean;



import it.polimi.authentication.ejb.usermanagement.Hotel;
import it.polimi.authentication.ejb.usermanagement.ListaHotel;
import it.polimi.authentication.ejb.usermanagement.PacchettoEscursione;
import it.polimi.authentication.ejb.usermanagement.PacchettoHotel;
import it.polimi.authentication.ejb.usermanagement.dto.HotelDTO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Session Bean implementation class UserBean
 */
@Stateless
public class RitrovaListaHotel implements ListaHotel{


	@PersistenceContext
    private EntityManager em;
	
	public RitrovaListaHotel(){	
	}
	
	@Override
	public ArrayList <HotelDTO> AllHotel()
	{
		Query q2 = em.createNamedQuery("Hotel.findAllOk");
		List<Hotel>HotelList = new ArrayList<Hotel>();
		HotelList=(List<Hotel>) q2.getResultList();
		ArrayList<HotelDTO> HotelListDTO = new ArrayList<HotelDTO>();

		for (int i=0; i<HotelList.size(); i++)
		{
			Query q= em.createNamedQuery("Hotel.findS").setParameter("nomeH", HotelList.get(i).getNomeHotel());
			int Stelle = (int) q.getSingleResult();
			HotelDTO app = new HotelDTO();
			app.setNome(HotelList.get(i).getNomeHotel());
			app.setCitta(HotelList.get(i).getCitta());
			app.setIndirizzo(HotelList.get(i).getIndirizzo());
			app.setPrezzo(HotelList.get(i).getPrezzo());
			app.setStelle(Stelle );
			HotelListDTO.add(app);
		}
		HotelList = new ArrayList<Hotel>();
		return HotelListDTO;	
	}
	
	@Override
	public ArrayList <HotelDTO> HotelList(String citta){
	
		Query q= em.createNamedQuery("Hotel.findHotelInCity").setParameter("city", citta);
		
		List<Hotel>HotelList =(List<Hotel>) q.getResultList();
		
		ArrayList<HotelDTO> HotelListDTO = new ArrayList<HotelDTO>();
		
		
	
		for (int i=0; i<HotelList.size(); i++)
		{
			HotelDTO app = new HotelDTO();
			app.setNome(HotelList.get(i).getNomeHotel());
			HotelListDTO.add(app);
		}
		
		return HotelListDTO;
	}

	@Override
	public void applicaModificaHotel(String nomeHotel, int stelleHotel, BigDecimal prezzoHotel) {
		
		BigDecimal vecchioPrezzoHotel;
		Query vecchioPH;
		//prende il vecchio prezzo dell'Hotel
		vecchioPH = em.createNamedQuery("Hotel.findPrezzo").setParameter("nomeH", nomeHotel);
		vecchioPrezzoHotel = (BigDecimal) vecchioPH.getSingleResult();
		
		int vecchieStelleHotel;
		Query vecchieS = em.createNamedQuery("Hotel.findStelle").setParameter("nomeH", nomeHotel);
		vecchieStelleHotel = (int) vecchieS.getSingleResult();
		
		if(stelleHotel!=vecchieStelleHotel && stelleHotel!=0) {System.out.println ("entro modifica stelle");
			
			em.createNativeQuery("UPDATE Hotel h SET h.Stelle = '"+stelleHotel+"' WHERE h.nomeHotel='"+nomeHotel+"'").executeUpdate();}
		
		if ((prezzoHotel != null) && !prezzoHotel.equals(vecchioPrezzoHotel)) {
			
			BigDecimal vecchioPrezzoPacchetto;
			BigDecimal nuovoPrezzo;
			Query vecchioP;
			
			//trova tutti i pacchetti che contengono l'hotel
			
			Query idP = em.createNamedQuery("PacchettoHotel.findPacchetto").setParameter("nomeHotel", nomeHotel);
			List<PacchettoHotel> idPacchetto = (List<PacchettoHotel>) idP.getResultList();
			
			for(int i=0; i<idPacchetto.size();i++){
				//aggiorna i prezzi di tutti i pacchetti che contengono l'hotel
				
				nuovoPrezzo = new BigDecimal(0.00);
				//prende il prezzo del pacchetto al posto i della lista
				vecchioP = em.createNamedQuery("Pacchetto.findPrezzo").setParameter("idPacchetto", idPacchetto.get(i).getIDPacchetto());
				vecchioPrezzoPacchetto = (BigDecimal) vecchioP.getSingleResult();
			
				
				//nuovoPrezzo*numeronotti
				Date dataPartenza = (Date) em.createNamedQuery("Pacchetto.findDataPartenza").setParameter("idPacchetto", idPacchetto.get(i).getIDPacchetto()).getSingleResult();
				Date dataRitorno = (Date) em.createNamedQuery("Pacchetto.findDataRitorno").setParameter("idPacchetto", idPacchetto.get(i).getIDPacchetto()).getSingleResult();
				
				long millisDiff = dataRitorno.getTime() - dataPartenza.getTime();
				int days = (int) (millisDiff / 86400000);
				BigDecimal durataViaggio = new BigDecimal (days);
				System.out.println(dataPartenza);
				System.out.println(dataRitorno);
				System.out.println(durataViaggio);
				
				//somma per trovare il nuovo prezzo del pacchetto
				nuovoPrezzo = vecchioPrezzoPacchetto.subtract(durataViaggio.multiply(vecchioPrezzoHotel.subtract(prezzoHotel)));
//				nuovoPrezzo = nuovoPrezzo.add(vecchioPrezzoPacchetto.subtract(vecchioPrezzoHotel.subtract(prezzoHotel.multiply(durataViaggio))));
//				nuovoPrezzo = nuovoPrezzo.multiply(durataViaggio);
				//sostituisce il prezzo in pacchetto
				
				em.createQuery("UPDATE Pacchetto p SET p.prezzo ="+nuovoPrezzo+" WHERE p.id='"+idPacchetto.get(i).getIDPacchetto()+"'").executeUpdate();
			}
		
			//aggiorna il prezzo dell'h
			em.createQuery("UPDATE Hotel h SET h.prezzo ="+prezzoHotel+" WHERE h.nomeHotel='"+nomeHotel+"'").executeUpdate();
		}
		
	}
	
	
}


